#!/bin/sh
set -e
set -x

if [ "$ARCH" = "" ]; then
	ARCH=`uname -m`
fi

if [ "$ARCH" = "mingw32" -o "$ARCH" = "mingw64" -o "$ARCH" = "arm32" ]; then
	unset CC
fi

ENABLE_ASM="${ENABLE_ASM:=ON}"

if type apt-get >/dev/null 2>&1; then
	sudo apt-get update
	sudo apt-get install -y cmake ninja-build
fi

# generate source tree
./autogen.sh

VERSION=`cat VERSION`

# test macOS
if [ `uname` = "Darwin" ]; then
	# test autotools
	./configure

	# make distribution
	make -j 4 distcheck

	# test cmake
	tar zxvf libressl-$VERSION.tar.gz
	cd libressl-$VERSION

	(
		mkdir build-static
		cd build-static
		cmake -DCMAKE_OSX_ARCHITECTURES=$ARCH ..
		make -j 4
		if [ "$ARCH" = "arm64" ] && [ "$OS" = "macos-12" ] || [ "$OS" = "macos-13" ]; then
			echo "##### skip tests"
		else
			make test
		fi
	)

	(
		mkdir build-shared
		cd build-shared
		cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_OSX_ARCHITECTURES=$ARCH ..
		make -j 4
		if [ "$ARCH" = "arm64" ] && [ "$OS" = "macos-12" ] || [ "$OS" = "macos-13" ]; then
			echo "##### skip tests"
		else
			make test
		fi
	)

# assuming Linux below
elif [ "$ARCH" = "native" ]; then
	# test autotools
	./configure

	# make distribution
	make -j 4 distcheck

	tar zxvf libressl-$VERSION.tar.gz
	cd libressl-$VERSION


	# test cmake and ninja
	(
		mkdir build-static
		cd build-static
		cmake -GNinja -DENABLE_ASM=${ENABLE_ASM} ..
		ninja
		ninja test
	)

	(
		mkdir build-shared
		cd build-shared
		cmake -GNinja -DBUILD_SHARED_LIBS=ON -DENABLE_ASM=${ENABLE_ASM} ..
		ninja
		ninja test
	)

elif [ "$ARCH" = "mingw32" -o "$ARCH" = "mingw64" ]; then
	CPU=i686
	if [ "$ARCH" = "mingw64" ]; then
		CPU=x86_64
	fi

	if ! type i686-w64-mingw32-gcc > /dev/null; then
		sudo apt-get install -y mingw-w64
	fi

	./configure --host=$CPU-w64-mingw32
	make -j 4

	(
	 rm -fr build-static
	 mkdir build-static
	 cd build-static
	 cmake -GNinja -DCMAKE_TOOLCHAIN_FILE=../scripts/$CPU-w64-mingw32.cmake -DENABLE_ASM=${ENABLE_ASM} ..
	 ninja -j 4
	)
	(
	 rm -fr build-shared
	 mkdir build-shared
	 cd build-shared
	 cmake -GNinja -DCMAKE_TOOLCHAIN_FILE=../scripts/$CPU-w64-mingw32.cmake -DBUILD_SHARED_LIBS=ON -DENABLE_ASM=${ENABLE_ASM} ..
	 ninja -j 4
	)

elif [ "$ARCH" = "arm32" -o "$ARCH" = "arm64" ]; then
	sudo apt-get install -y qemu-user-static binfmt-support

	if [ "$ARCH" = "arm32" ]; then
		sudo apt-get install -y g++-arm-linux-gnueabihf
		sudo ln -sf /usr/arm-linux-gnueabihf/lib/ld-linux-armhf.so.3 /lib/
		./configure --host=arm-linux-gnueabihf
		LD_LIBRARY_PATH=/usr/arm-linux-gnueabihf/lib make -j 4 check
	else
		sudo apt-get install -y g++-aarch64-linux-gnu
		sudo ln -sf /usr/aarch64-linux-gnu/lib/ld-linux-aarch64.so.1 /lib/
		./configure --host=aarch64-linux-gnu
		LD_LIBRARY_PATH=/usr/aarch64-linux-gnu/lib make -j 4 check
	fi

	file apps/openssl/.libs/openssl

elif [ "$ARCH" = "loong64" ]; then
	sudo apt install -y qemu-user-static binfmt-support g++-14-loongarch64-linux-gnu
	sudo ln -sf /usr/loongarch64-linux-gnu/lib64/ld-linux-loongarch-lp64d.so.1 /lib64

	CC=loongarch64-linux-gnu-gcc-14
	CXX=loongarch64-linux-gnu++-14
	AR=loongarch64-linux-gnu-ar
	STRIP=loongarch64-linux-gnu-strip-14
	RANLIB=loongarch64-linux-gnu-ranlib

	./configure --host=loongarch64-linux-gnu
	LD_LIBRARY_PATH=/usr/loongarch64-linux-gnu/lib make -j 4 check

	file apps/openssl/openssl

elif [ "$ARCH" = "mips32" -o "$ARCH" = "mips64" ]; then
	sudo apt-get install -y qemu-user-static binfmt-support

	if [ "$ARCH" = "mips32" ]; then
		sudo apt-get install -y g++-mips-linux-gnu
		sudo ln -sf /usr/mipsel-linux-gnu/lib/ld.so.1 /lib/
		./configure --host=mipsel-linux-gnu
		LD_LIBRARY_PATH=/usr/mipsel-linux-gnu/lib make -j 4 check
	else
		sudo apt-get install -y g++-mips64el-linux-gnuabi64
		sudo ln -sf /usr/mips64el-linux-gnuabi64/lib64/ld.so.1 /lib64
		./configure --host=mips64el-linux-gnuabi64
		LD_LIBRARY_PATH=/usr/mips64el-linux-gnuabi64/lib make -j 4 check
	fi

	file apps/openssl/.libs/openssl

elif [ "$ARCH" = "android" ]; then
	export TC_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake

	# set target API level and architecture
	level_arch=""
	level=$MIN_NAL
	while [ $level -le $MAX_NAL ]
	do
		level_arch="$level_arch $level;x86_64"
		level_arch="$level_arch $level;x86"
		level_arch="$level_arch $level;arm64-v8a"

		level=`expr $level + 1`
	done

	echo "##### level_arch = $level_arch"

	# build each API level and architecture
	for la in $level_arch
	do
		NAL=`echo $la | cut -d ';' -f 1`
		ABI=`echo $la | cut -d ';' -f 2`
		echo ""
		echo "##### Date: `date`, Native API level: $NAL, ABI: $ABI"

		(
		 build_dir=build-$NAL_$ABI
		 rm -fr $build_dir include/openssl/opensslconf.h
		 mkdir $build_dir
		 cd $build_dir
		 echo "##### cmake -GNinja -DCMAKE_MAKE_PROGRAM=ninja -DANDROID_NDK=$ANDROID_NDK_HOME -DCMAKE_TOOLCHAIN_FILE=$TC_FILE -DANDROID_ABI=$ABI -DANDROID_NATIVE_API_LEVEL=$NAL .."
		 cmake -GNinja -DCMAKE_MAKE_PROGRAM=ninja \
		 -DANDROID_NDK=$ANDROID_NDK_HOME \
		 -DCMAKE_TOOLCHAIN_FILE=$TC_FILE \
		 -DANDROID_ABI=$ABI -DANDROID_NATIVE_API_LEVEL=$NAL \
		 -DENABLE_ASM=${ENABLE_ASM} ..

		 ninja -j 4

		 echo ""
		 file apps/openssl/openssl
		)
	done
fi
